{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Arnoldi Iteration"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import numpy.linalg as la\n",
        "\n",
        "import matplotlib.pyplot as pt"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Let us make a matrix with a defined set of eigenvalues and eigenvectors, given by `eigvals` and `eigvecs`."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "collapsed": false
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "[ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12. 13. 14. 15. 16. 17. 18.\n",
            " 19. 20. 21. 22. 23. 24. 25.]\n",
            "[25. 24. 23.  1.  2.  3. 22.  4. 21. 20.  5.  6.  7. 19. 18.  8.  9. 17.\n",
            " 16. 10. 11. 12. 15. 14. 13.]\n"
          ]
        }
      ],
      "source": [
        "np.random.seed(40)\n",
        "\n",
        "# Generate matrix with eigenvalues 1...25\n",
        "n = 25\n",
        "eigvals = np.linspace(1., n, n)\n",
        "eigvecs = np.random.randn(n, n)\n",
        "print(eigvals)\n",
        "\n",
        "A = la.solve(eigvecs, np.dot(np.diag(eigvals), eigvecs))\n",
        "print(la.eig(A)[0])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Initialization"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Set up $Q$ and $H$:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "Q = np.zeros((n, n))\n",
        "H = np.zeros((n, n))\n",
        "\n",
        "k = 0"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Pick a starting vector, normalize it"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "collapsed": true
      },
      "outputs": [],
      "source": [
        "x0 = np.random.randn(n)\n",
        "x0 = x0/la.norm(x0)\n",
        "\n",
        "# Poke it into the first column of Q\n",
        "Q[:, k] = x0\n",
        "\n",
        "del x0"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Make a list to save arrays of Ritz values:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "collapsed": true
      },
      "outputs": [],
      "source": [
        "ritz_values = []"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Algorithm"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Carry out one iteration of Arnoldi iteration.\n",
        "\n",
        "Run this cell in-place (Ctrl-Enter) until H is filled."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 30,
      "metadata": {
        "collapsed": false
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "24\n"
          ]
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "needs_background": "light"
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "print(k)\n",
        "\n",
        "u = A @ Q[:, k]\n",
        "\n",
        "# Carry out Gram-Schmidt on u against Q\n",
        "for j in range(k+1):\n",
        "    qj = Q[:, j]\n",
        "    H[j,k] = qj @ u\n",
        "    u = u - H[j,k]*qj\n",
        "\n",
        "if k+1 < n:\n",
        "    H[k+1, k] = la.norm(u)\n",
        "    Q[:, k+1] = u/H[k+1, k]\n",
        "\n",
        "k += 1\n",
        "\n",
        "pt.spy(H)\n",
        "\n",
        "ritz_values.append(la.eig(H)[0])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Check that $Q^T A Q =H$:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 31,
      "metadata": {
        "collapsed": false
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "5.694093461629727e-08"
            ]
          },
          "execution_count": 31,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "la.norm(Q.T @ A @ Q - H)/ la.norm(A)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Check that Q is orthogonal:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 32,
      "metadata": {
        "collapsed": false
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "9.785682262092261e-08"
            ]
          },
          "execution_count": 32,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "la.norm(Q.T @ Q - np.eye(n))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Plot convergence of Ritz values"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Enable the Ritz value collection above to make this work."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 74,
      "metadata": {
        "collapsed": false
      },
      "outputs": [
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "/usr/lib/python3/dist-packages/numpy/core/numeric.py:474: ComplexWarning: Casting complex values to real discards the imaginary part\n",
            "  return array(a, dtype, copy=False, order=order)\n"
          ]
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7fdec8d0e978>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "for i, rv in enumerate(ritz_values):\n",
        "    pt.plot([i] * len(rv), rv, \"x\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": []
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.2+"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 2
}